package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 * sample 可以从数据源中随机抽取一些样本数据进行分析
 *
 */
object Spark08_RDD_Operator_Sample {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)

    val rdd = context.makeRDD(List(1,2,3,4,5,6,7,8,9))
    // sample 有三个参数
    /**
     * 第一个参数，抽取出来的数据是否需要放回去，如果放回去会增加重复抽到的概率 true 放回 false 丢弃
     * 第二个每天数据被抽取的概率 0.4 每个数据被抽取为40%，不完全准确
     * 第三个参数，抽取随机数的种子
     */
    rdd.sample(false,
      0.4,
      1)//如果随机种子确定，那么无论重复多少次都是固定的，可以不传
      .collect().mkString(",")

    /**
     *  有什么用处？
     *
     *  当然抽奖也是一个用处，
     *  之前讲过groupBy会打散，随机组合放到不通的分区里
     *  那么也许存在一种极端的情况，一个分区里被分到了大量的数据，另一个分区则
     *  一条都没有，那么在处理的时候，一个分区会处理的非常慢，另一个分区会非常快
     *  所以资源的分配就不合理
     *  那么你可以在做执行操作之前，随机对数据非常多的分区进行随机采样
     *  例如，你第一次采样发现取了100条，字母a出现了99此，第二次97次，第三次96次
     *  说明，第一个分区的a字母数据太多，是否需要做特殊处理，让他比重降低点。
     */

    context.stop();
  }
}
